package it.gestionedocumentale.struts.form;

import it.gestionedocumentale.model.Classificazione;
import it.gestionedocumentale.model.Gruppo;
import it.gestionedocumentale.model.Tag;
import it.gestionedocumentale.model.Utente;
import it.gestionedocumentale.spring.service.MyServiceFactory;

import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.upload.FormFile;

public class DocumentoForm extends ActionForm {
	private static Log log = LogFactory.getLog(DocumentoForm.class);
	

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private Long idDocumento;
	private FormFile file;
	private String path;
	private String nome;
	private String dataUploadString;
	private Double size;
	private Date dataUpload;
	private int[] tags;
	private int[] utenti;
	private int[] gruppi;
	private String pagina;
	private String parametro;
	private Long idClassificazione;
	
	
	public Long getIdDocumento() {
		return idDocumento;
	}
	public void setIdDocumento(Long idDocumento) {
		this.idDocumento = idDocumento;
	}
	public FormFile getFile() {
		return file;
	}
	public void setFile(FormFile file) {
		this.file = file;
	}
	public String getPath() {
		return path;
	}
	public void setPath(String path) {
		this.path = path;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getDataUploadString() {
		return dataUploadString;
	}
	public void setDataUploadString(String dataUploadString) {
		this.dataUploadString = dataUploadString;
	}
	public Date getDataUpload() {
		return dataUpload;
	}
	public Double getSize() {
		return size;
	}
	public void setSize(Double size) {
		this.size = size;
	}
	public void setDataUpload(Date dataUpload) {
		this.dataUpload = dataUpload;
	}
	public int[] getTags() {
		return tags;
	}
	public void setTags(int[] tags) {
		this.tags = tags;
	}
	
	public int[] getUtenti() {
		return utenti;
	}
	public void setUtenti(int[] utenti) {
		this.utenti = utenti;
	}
	
	public int[] getGruppi() {
		return gruppi;
	}
	public void setGruppi(int[] gruppi) {
		this.gruppi = gruppi;
	}
	public String getPagina() {
		return pagina;
	}
	public void setPagina(String pagina) {
		this.pagina = pagina;
	}
	
	public String getParametro() {
		return parametro;
	}
	
	public void setParametro(String parametro) {
		this.parametro = parametro;
	}
	
	public Long getIdClassificazione() {
		return idClassificazione;
	}
	public void setIdClassificazione(Long idClassificazione) {
		this.idClassificazione = idClassificazione;
	}
	
	@Override
	public ActionErrors validate(ActionMapping mapping,
			HttpServletRequest request) {
		
		ActionErrors errors = new ActionErrors();
	    
		if(getPagina()!=null && getPagina().equals("update")){
			String filePath = "/home/gestdoc/Documenti/file-upload/";
			String nomeFile = this.file.getFileName();
			
			if(!nomeFile.equals("")){  
			    File fileToCreate = new File(filePath, nomeFile);
			    if(fileToCreate.exists()){
			    	errors.add("upload", new ActionMessage("errors.upload.file.file_gia_esistente"));
			    }
			}else{
				errors.add("upload", new ActionMessage("errors.upload.file.file_vuoto"));
			}
		}
		
		if(getPagina()!=null && getPagina().equals("conferma")){

			if((getUtenti()==null || getUtenti().length==0) && (getGruppi()==null || getGruppi().length==0) ){
				errors.add("upload", new ActionMessage("errors.upload.utenti_gruppi.non_selezionato"));
			}
			
			// carica tutte le lista per la pagina di confermaUploadDocumentoForm
			if(errors.size()>0){
				@SuppressWarnings("unchecked")
				List<Classificazione> listaSelezioneClass = 
						(List<Classificazione>) request.getSession().getAttribute("listaSelezioneClass");
				
				Classificazione classificazione = new Classificazione();
				List<Classificazione> listaClassificazioni = new ArrayList<Classificazione>();
				List<Gruppo> listaGruppi = new ArrayList<Gruppo>();
				List<Tag> listaTag = new ArrayList<Tag>();
				List<Utente> listaUtenti = new ArrayList<Utente>();
				
				try {
					
					// ******************** lista di classificazione del DB ********************
					listaClassificazioni = MyServiceFactory.getClassificazioneService().findAll();
					
					// ******************** lista gruppi dal DB ********************
				    listaGruppi = MyServiceFactory.getGruppoService().findAll();
				    
				    // ******************** lista di tag dal DB ********************
				    listaTag = MyServiceFactory.getTagService().findAll();
				    
				    // ******************** lista di utenti dal DB ********************
				    listaUtenti = MyServiceFactory.getUtenteService().findAll();
					
					// rimozione dalla lista della classificazione selezionata
					for(int i = 0; i < listaSelezioneClass.size(); i++){
						
						classificazione = listaSelezioneClass.get(i);
						
						for(int j = 0; j < listaClassificazioni.size(); j++){
						
							Classificazione classificazioneToRemove = listaClassificazioni.get(j);
						
							if(classificazione.equals(classificazioneToRemove)){
								listaClassificazioni.remove(j);
							}
						}
					}
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					log.error(e);
					mapping.findForward("error");
				}
				request.getSession().setAttribute("listaSelezioneClass", listaSelezioneClass);
				request.setAttribute("listaClassificazioni", listaClassificazioni);
				request.setAttribute("listaGruppi", listaGruppi);
			    request.setAttribute("listaTag", listaTag);
			    request.setAttribute("listaUtenti", listaUtenti);
			}// if(errors.size()>0)
		}// if(getPagina()!=null && getPagina().equals("conferma"))
		
		return errors;
	}
	

}
